<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>TestCases</title>
    <script type="text/javascript" src="js/dateextract.js" charset="utf-8"></script>
    <script type="text/javascript">
function testDateEqualsToDate(d1, d2) {
  return testDateEquals(d1, d2.getFullYear(), d2.getMonth(), d2.getDate(), d2.getHours(), d2.getMinutes());
}
function testDateEquals(d, year, month, date, hour, minute) {
  return d.getFullYear()==year && d.getMonth()==month &&
         d.getDate()==date && d.getHours()==hour && d.getMinutes()==minute;
}
var testcases = [
  { input     : '12/30 14:00-15:00',
    assertion : function(dd) {
      var d = new Date();
      if (dd.length==2 && testDateEquals(dd[0], d.getFullYear(), 11, 30, 14, 0)
                       && testDateEquals(dd[1], d.getFullYear(), 11, 30, 15, 0)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '1月15日 23時',
    assertion : function(dd) {
      var d = new Date();
      if (dd.length==1 && testDateEquals(dd[0], d.getFullYear(), 0, 15, 23, 0)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '2007/01/10',
    assertion : function(dd) {
      if (dd.length==1 && testDateEquals(dd[0], 2007, 0, 10, 00, 00)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 

  ,

  { input     : '２／１４〜１６',
    assertion : function(dd) {
      var d = new Date();
      if (dd.length==2 && testDateEquals(dd[0], d.getFullYear(), 1, 14, 00, 00)
                       && testDateEquals(dd[1], d.getFullYear(), 1, 16, 00, 00)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 

  ,

  { input     : '２００７年３月１３日',
    assertion : function(dd) {
      if (dd.length==1 && testDateEquals(dd[0], 2007, 2, 13, 00, 00)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '一昨日の１２：１５から１４時10分',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()-2);
      d1.setHours(12);
      d1.setMinutes(15);
      var d2 = new Date(d1);
      d2.setHours(14);
      d2.setMinutes(10);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) 
                       && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(', ');
      }
    }
  } 
  ,

  { input     : '明後日 １０：１５－１３：００ ミーティング',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()+2);
      d1.setHours(10);
      d1.setMinutes(15);
      var d2 = new Date(d1);
      d2.setHours(13);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) 
                       && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(', ');
      }
    }
  } 
  ,

  { input     : '先々週末',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()-7*2-d1.getDay()+6);
      d1.setHours(0);
      d1.setMinutes(0);
      if (dd.length==1 && testDateEqualsToDate(dd[0], d1)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(', ');
      }
    }
  } 
  ,

  { input     : '今日の午後8時半',
    assertion : function(dd) {
      var d = new Date();
      d.setMinutes(30);
      d.setHours(20);
      if (dd.length==1 && testDateEqualsToDate(dd[0], d)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '明後日　１４：００から２時間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()+2);
      d1.setHours(14);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(16);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '再来月の第二水曜日 8:00ー19時',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setMonth(d1.getMonth()+2)
      d1.setDate(1);
      var dy = 3;
      var w = 2;
      d1.setDate((7 + dy - d1.getDay()) % 7 + 1 + 7*(w-1));
      d1.setHours(8);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(19);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1)
                       && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '午前９時半～午後５時半',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(9);
      d1.setMinutes(30);
      var d2 = new Date(d1);
      d2.setHours(17);
      d2.setMinutes(30);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '午前8時半(1h30m)',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(8);
      d1.setMinutes(30);
      var d2 = new Date(d1);
      d2.setHours(10);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '午前8時半から１時間半',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(8);
      d1.setMinutes(30);
      var d2 = new Date(d1);
      d2.setHours(10);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '午前9：００ー午後8時',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(9);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(20);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '15時～１９時',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(15);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(19);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '15時－１９時',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(15);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(19);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '午後5時から午後9時',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setHours(17);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setHours(21);
      d2.setMinutes(0);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '3日後から2日間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()+3);
      d1.setHours(0);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setDate(d1.getDate()+2);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '明後日から3週間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()+2);
      d1.setHours(0);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setDate(d1.getDate()+3*7);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '先々週の土曜日から４日間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(d1.getDate()-2*7);
      d1.setDate(d1.getDate()-d1.getDay()+6);
      d1.setHours(0);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setDate(d1.getDate()+4);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1) && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '再来月の第二水曜日から10日間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setMonth(d1.getMonth()+2)
      d1.setDate(1);
      var dy = 3;
      var w = 2;
      d1.setDate((7 + dy - d1.getDay()) % 7 + 1 + 7*(w-1));
      d1.setHours(0);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setDate(d1.getDate()+10);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1)
                       && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 
  ,

  { input     : '29日から3日間',
    assertion : function(dd) {
      var d1 = new Date();
      d1.setDate(29);
      d1.setHours(0);
      d1.setMinutes(0);
      var d2 = new Date(d1);
      d2.setDate(d1.getDate()+3);
      if (dd.length==2 && testDateEqualsToDate(dd[0], d1)
                       && testDateEqualsToDate(dd[1], d2)) {
        return true;
      } else {
        throw 'Error. Extracted result is : '+dd.join(' , ');
      }
    }
  } 

]


window.onload = function() {
  var de = new DateExtractor();
  var table = document.getElementById('testresult');
  var tbody = document.createElement('tbody');
  for (var i=0; i<testcases.length; i++) {
    var tr = document.createElement('tr');
    var dd = de.extractDate(testcases[i].input);
    var td1 = document.createElement('td');
    var td2 = document.createElement('td');
    td1.innerHTML = '"'+testcases[i].input+'"';
    try { 
      testcases[i].assertion(dd);
      td2.className = 'success';
      td2.innerHTML = 'OK';
    } catch (e) {
      td2.className = 'error';
      td2.innerHTML = e;
    }
    tr.appendChild(td1);
    tr.appendChild(td2);
    tbody.appendChild(tr);
  }
  table.appendChild(tbody);
}
    </script>
  </head>
  <body>
    <table id="testresult"></table>
  </body>
</html>
